{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "52545e6a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "from sklearn.preprocessing import MinMaxScaler\n",
    "import matplotlib.pyplot as plt\n",
    "from core.model import Model\n",
    "\n",
    "import json"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "2797ad65",
   "metadata": {},
   "outputs": [],
   "source": [
    "def plot_results(predicted_data, true_data):\n",
    "    fig = plt.figure(facecolor='white')\n",
    "    ax = fig.add_subplot(111)\n",
    "    ax.plot(true_data, label='True Data')\n",
    "    plt.plot(predicted_data, label='Prediction')\n",
    "    plt.legend()\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "c4b0840c",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_csv('./data/sh600031.csv')  # 读取股票文件\n",
    "df.set_index('date', inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "439b183e",
   "metadata": {},
   "outputs": [],
   "source": [
    "df.drop(['volume'],axis=1,inplace=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "588096bf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>open</th>\n",
       "      <th>high</th>\n",
       "      <th>low</th>\n",
       "      <th>close</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>date</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>2003-07-03</th>\n",
       "      <td>23.00</td>\n",
       "      <td>23.00</td>\n",
       "      <td>20.10</td>\n",
       "      <td>21.30</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-04</th>\n",
       "      <td>21.30</td>\n",
       "      <td>22.18</td>\n",
       "      <td>21.05</td>\n",
       "      <td>21.84</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-07</th>\n",
       "      <td>21.90</td>\n",
       "      <td>21.96</td>\n",
       "      <td>21.51</td>\n",
       "      <td>21.80</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-08</th>\n",
       "      <td>21.80</td>\n",
       "      <td>22.22</td>\n",
       "      <td>21.70</td>\n",
       "      <td>21.91</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2003-07-09</th>\n",
       "      <td>21.75</td>\n",
       "      <td>22.65</td>\n",
       "      <td>21.70</td>\n",
       "      <td>22.47</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             open   high    low  close\n",
       "date                                  \n",
       "2003-07-03  23.00  23.00  20.10  21.30\n",
       "2003-07-04  21.30  22.18  21.05  21.84\n",
       "2003-07-07  21.90  21.96  21.51  21.80\n",
       "2003-07-08  21.80  22.22  21.70  21.91\n",
       "2003-07-09  21.75  22.65  21.70  22.47"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "8e91a869",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 获取DataFrame中的数据，形式为数组array形式\n",
    "values = df.values\n",
    "# 确保所有数据为float类型\n",
    "values = values.astype('float32')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "fbdb18bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义series_to_supervised()函数\n",
    "# 将时间序列转换为监督学习问题\n",
    "def series_to_supervised(data, training_category, forecast_category, n_in=1, n_out=1, dropnan=True):\n",
    "    \"\"\"\n",
    "    将时间序列框定为有监督的学习数据集。\n",
    "        论据：\n",
    "        数据：作为列表或NumPy数组的观察序列。\n",
    "        n_in：作为输入的滞后观测数（X）。\n",
    "        n_out：作为输出的观察数（y）。\n",
    "        dropnan：布尔值，决定是否删除具有NaN值的行。\n",
    "    返回：\n",
    "    pd.DataFrame(用于监督学习)\n",
    "    \"\"\"\n",
    "    cols, names = list(), list()\n",
    "    \n",
    "    df = pd.DataFrame(data,columns = training_category)\n",
    "    n_vars =  df.shape[1]\n",
    "    # input sequence (t-n, ... t-1)\n",
    "    for i in range(n_in, 0, -1):\n",
    "        cols.append(df.shift(i))\n",
    "        names += [('var%d(t-%d)' % (j + 1, i)) for j in range(n_vars)]\n",
    "    \n",
    "    # forecast sequence (t, t+1, ... t+n)\n",
    "    df = df.drop([column for column in df.columns if column not in forecast_category],axis=1)\n",
    "    n_vars =  df.shape[1]\n",
    "    for i in range(0, n_out):\n",
    "        cols.append(df.shift(-i))\n",
    "        if i == 0:\n",
    "            names += [('var%d(t)' % (j + 1)) for j in range(n_vars)]\n",
    "        else:\n",
    "            names += [('var%d(t+%d)' % (j + 1, i)) for j in range(n_vars)]\n",
    "    \n",
    "    # put it all together\n",
    "    agg = pd.concat(cols, axis=1)\n",
    "    agg.columns = names\n",
    "    # drop rows with NaN values\n",
    "    if dropnan:\n",
    "        agg.dropna(inplace=True)\n",
    "    return agg"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b4599843",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "# 将时间序列转换为监督学习问题\n",
    "reframed = series_to_supervised(values,['open','high','low','close'],['close'],1, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "885302e4",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>var1(t-1)</th>\n",
       "      <th>var2(t-1)</th>\n",
       "      <th>var3(t-1)</th>\n",
       "      <th>var4(t-1)</th>\n",
       "      <th>var1(t)</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>23.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>20.100000</td>\n",
       "      <td>21.299999</td>\n",
       "      <td>21.840000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>21.299999</td>\n",
       "      <td>22.180000</td>\n",
       "      <td>21.049999</td>\n",
       "      <td>21.840000</td>\n",
       "      <td>21.799999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>21.900000</td>\n",
       "      <td>21.959999</td>\n",
       "      <td>21.510000</td>\n",
       "      <td>21.799999</td>\n",
       "      <td>21.910000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>21.799999</td>\n",
       "      <td>22.219999</td>\n",
       "      <td>21.700001</td>\n",
       "      <td>21.910000</td>\n",
       "      <td>22.469999</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>21.750000</td>\n",
       "      <td>22.650000</td>\n",
       "      <td>21.700001</td>\n",
       "      <td>22.469999</td>\n",
       "      <td>22.650000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   var1(t-1)  var2(t-1)  var3(t-1)  var4(t-1)    var1(t)\n",
       "1  23.000000  23.000000  20.100000  21.299999  21.840000\n",
       "2  21.299999  22.180000  21.049999  21.840000  21.799999\n",
       "3  21.900000  21.959999  21.510000  21.799999  21.910000\n",
       "4  21.799999  22.219999  21.700001  21.910000  22.469999\n",
       "5  21.750000  22.650000  21.700001  22.469999  22.650000"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reframed.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "91d4be5a",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 划分训练集和测试集\n",
    "train = reframed.iloc[:int(len(reframed) * 0.85), :].values\n",
    "test = reframed.iloc[int(len(reframed) * 0.85):, :].values\n",
    "# 划分训练集和测试集的输入和输出\n",
    "train_X, train_y = train[:, :-1], train[:, -1:]\n",
    "test_X, test_y = test[:, :-1], test[:, -1:]\n",
    "# 转化为三维数据\n",
    "# reshape input to be 3D [samples, timesteps, features]\n",
    "train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))\n",
    "test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "2768241e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((3759, 1, 4), (664, 1, 4))"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_X.shape,test_X.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "46db573f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((3759, 1), (664, 1))"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_y.shape,test_y.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "474b0179",
   "metadata": {
    "scrolled": false
   },
   "outputs": [],
   "source": [
    "configs = json.load(open('./test_1/config.json', 'r'))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "baa20f5c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Model] Model Compiled\n",
      "Time taken: 0:00:01.416287\n"
     ]
    }
   ],
   "source": [
    "model = Model()\n",
    "model.build_model(configs, train_X.shape[1], train_X.shape[2])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "8eaa9e30",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Model] Training Started\n",
      "[Model] 50 epochs, 64 batch size\n",
      "Epoch 1/50\n",
      "59/59 [==============================] - 13s 52ms/step - loss: 300.5077 - val_loss: 147.7256\n",
      "Epoch 2/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 135.4594 - val_loss: 87.1035\n",
      "Epoch 3/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 84.0734 - val_loss: 47.6324\n",
      "Epoch 4/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 59.4979 - val_loss: 28.8080\n",
      "Epoch 5/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 44.3788 - val_loss: 17.8411\n",
      "Epoch 6/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 34.7002 - val_loss: 11.9282\n",
      "Epoch 7/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 28.1831 - val_loss: 10.4712\n",
      "Epoch 8/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 23.4493 - val_loss: 6.1697\n",
      "Epoch 9/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 19.8516 - val_loss: 5.3911\n",
      "Epoch 10/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 17.8596 - val_loss: 4.9884\n",
      "Epoch 11/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 14.7311 - val_loss: 2.4946\n",
      "Epoch 12/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 13.0771 - val_loss: 2.8459\n",
      "Epoch 13/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 10.9262 - val_loss: 1.5286\n",
      "Epoch 14/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 9.8842 - val_loss: 2.4242\n",
      "Epoch 15/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 9.0451 - val_loss: 1.0663\n",
      "Epoch 16/50\n",
      "59/59 [==============================] - 1s 17ms/step - loss: 8.1228 - val_loss: 1.4587\n",
      "Epoch 17/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 7.4648 - val_loss: 0.7143\n",
      "Epoch 18/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 7.0800 - val_loss: 2.4127\n",
      "Epoch 19/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 7.1271 - val_loss: 0.5882\n",
      "Epoch 20/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 6.1002 - val_loss: 0.7718\n",
      "Epoch 21/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 5.7685 - val_loss: 0.6426\n",
      "Epoch 22/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 5.2688 - val_loss: 1.3907\n",
      "Epoch 23/50\n",
      "59/59 [==============================] - 1s 14ms/step - loss: 5.1615 - val_loss: 3.3114\n",
      "Epoch 24/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 4.8603 - val_loss: 3.5583\n",
      "Epoch 25/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 4.9564 - val_loss: 1.3790\n",
      "Epoch 26/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 4.2637 - val_loss: 1.5026\n",
      "Epoch 27/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 4.0642 - val_loss: 0.6844\n",
      "Epoch 28/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.8466 - val_loss: 1.4313\n",
      "Epoch 29/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 3.8749 - val_loss: 0.6119\n",
      "Epoch 30/50\n",
      "59/59 [==============================] - 1s 14ms/step - loss: 3.7540 - val_loss: 0.8309\n",
      "Epoch 31/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 4.4073 - val_loss: 0.8694\n",
      "Epoch 32/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.6484 - val_loss: 1.1380\n",
      "Epoch 33/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.6292 - val_loss: 1.7741\n",
      "Epoch 34/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 4.0664 - val_loss: 0.8581\n",
      "Epoch 35/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.4612 - val_loss: 0.7738\n",
      "Epoch 36/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.4833 - val_loss: 1.2165\n",
      "Epoch 37/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.2748 - val_loss: 0.7706\n",
      "Epoch 38/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 2.9400 - val_loss: 2.7172\n",
      "Epoch 39/50\n",
      "59/59 [==============================] - 1s 14ms/step - loss: 3.3381 - val_loss: 0.9430\n",
      "Epoch 40/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.2051 - val_loss: 0.6328\n",
      "Epoch 41/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.6080 - val_loss: 0.7543\n",
      "Epoch 42/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.4490 - val_loss: 0.6546\n",
      "Epoch 43/50\n",
      "59/59 [==============================] - 1s 16ms/step - loss: 2.8891 - val_loss: 0.5730\n",
      "Epoch 44/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.1218 - val_loss: 1.5324\n",
      "Epoch 45/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.3160 - val_loss: 1.3535\n",
      "Epoch 46/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.1972 - val_loss: 3.5283\n",
      "Epoch 47/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.6031 - val_loss: 4.4382\n",
      "Epoch 48/50\n",
      "59/59 [==============================] - 1s 14ms/step - loss: 3.3686 - val_loss: 2.6029\n",
      "Epoch 49/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.1507 - val_loss: 1.0676\n",
      "Epoch 50/50\n",
      "59/59 [==============================] - 1s 15ms/step - loss: 3.6010 - val_loss: 1.8397\n",
      "[Model] Training Completed. Model saved as save_models\n",
      "Time taken: 0:00:57.689763\n"
     ]
    }
   ],
   "source": [
    "# 内存中训练\n",
    "model.train(\n",
    "    train_X,\n",
    "    train_y,\n",
    "    epochs=configs['training']['epochs'],\n",
    "    batch_size=configs['training']['batch_size'],\n",
    "    validation_data=(test_X, test_y),\n",
    "    verbose=configs['training']['verbose'],\n",
    "    shuffle=configs['training']['shuffle'],\n",
    "    validation_freq=configs['training']['validation_freq'],\n",
    "    save_dir=configs['model']['save_dir']\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "cacd9cda",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[Model] Predicting Point-by-Point...\n"
     ]
    }
   ],
   "source": [
    "y_predict = model.predict_point_by_point(test_X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "b07b62fd",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "test_y = test_y.reshape((len(test_y), 1))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "2987243d",
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_results(y_predict[-30:], test_y[-30:])"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "deep",
   "language": "python",
   "name": "deep"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
